package com.pai4j.pgc.service;

import com.pai4j.common.constants.WebConstant;
import com.pai4j.common.enums.RedisKeyEnum;
import com.pai4j.common.util.JsonUtil;
import com.pai4j.common.util.RedisUtil;
import com.pai4j.domain.vo.response.creator.CreatorDetailResponseVO;
import com.pai4j.domain.vo.response.creator.CreatorStatisticsResponseVO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

/**
 * 创作者缓存服务
 * 封装Redis缓存逻辑，提供创作者信息的缓存操作
 *
 * @author: CYM-pai
 * @date: 2025/11/01
 */
@Slf4j
@Service
public class CreatorCacheService {
    
    @Resource
    private RedisUtil redisUtil;
    
    /**
     * 从缓存获取创作者详情
     *
     * @param userId 用户ID
     * @return 创作者详情，如果缓存不存在返回null，如果缓存了空值返回特殊标记
     */
    public CreatorDetailResponseVO getCreatorDetailFromCache(String userId) {
        if (StringUtils.isBlank(userId)) {
            return null;
        }
        
        String cacheKey = RedisKeyEnum.CREATOR_DETAIL_CACHE.getKey(userId);
        String cache = redisUtil.get(cacheKey);
        
        if (StringUtils.isBlank(cache)) {
            log.debug("创作者详情缓存未命中: userId={}", userId);
            return null;
        }
        
        // 如果缓存的是空值标记，表示数据库中不存在该创作者
        if (WebConstant.CACHE_NONE.equals(cache)) {
            log.debug("创作者不存在（缓存空值）: userId={}", userId);
            return new CreatorDetailResponseVO(); // 返回空对象标记
        }
        
        log.debug("从缓存获取创作者详情: userId={}", userId);
        return JsonUtil.fromJson(cache, CreatorDetailResponseVO.class);
    }
    
    /**
     * 刷新创作者详情缓存
     *
     * @param userId 用户ID
     * @param creatorDetail 创作者详情
     */
    public void refreshCreatorDetailCache(String userId, CreatorDetailResponseVO creatorDetail) {
        if (StringUtils.isBlank(userId)) {
            return;
        }
        
        String cacheKey = RedisKeyEnum.CREATOR_DETAIL_CACHE.getKey(userId);
        
        if (creatorDetail == null) {
            log.debug("刷新创作者详情缓存为空值: userId={}", userId);
            redisUtil.set(cacheKey, WebConstant.CACHE_NONE, RedisKeyEnum.CREATOR_DETAIL_CACHE.getExpireTime());
        } else {
            log.debug("刷新创作者详情缓存: userId={}", userId);
            // 添加随机偏移量防止缓存雪崩（在过期时间上加5-10分钟的随机值）
            long expireTime = RedisKeyEnum.CREATOR_DETAIL_CACHE.getExpireTime();
            long randomOffset = (long) (Math.random() * 600); // 0-10分钟
            redisUtil.set(cacheKey, JsonUtil.toJsonString(creatorDetail), expireTime + randomOffset);
        }
    }
    
    /**
     * 删除创作者详情缓存
     *
     * @param userId 用户ID
     */
    public void deleteCreatorDetailCache(String userId) {
        if (StringUtils.isBlank(userId)) {
            return;
        }
        
        String cacheKey = RedisKeyEnum.CREATOR_DETAIL_CACHE.getKey(userId);
        redisUtil.del(cacheKey);
        log.debug("删除创作者详情缓存: userId={}", userId);
    }
    
    /**
     * 从缓存获取创作者统计信息
     *
     * @param userId 用户ID
     * @return 创作者统计信息
     */
    public CreatorStatisticsResponseVO getCreatorStatisticsFromCache(String userId) {
        if (StringUtils.isBlank(userId)) {
            return null;
        }
        
        String cacheKey = RedisKeyEnum.CREATOR_STATISTICS_CACHE.getKey(userId);
        String cache = redisUtil.get(cacheKey);
        
        if (StringUtils.isBlank(cache)) {
            log.debug("创作者统计信息缓存未命中: userId={}", userId);
            return null;
        }
        
        if (WebConstant.CACHE_NONE.equals(cache)) {
            log.debug("创作者统计信息不存在（缓存空值）: userId={}", userId);
            return null;
        }
        
        log.debug("从缓存获取创作者统计信息: userId={}", userId);
        return JsonUtil.fromJson(cache, CreatorStatisticsResponseVO.class);
    }
    
    /**
     * 刷新创作者统计信息缓存
     *
     * @param userId 用户ID
     * @param statistics 统计信息
     */
    public void refreshCreatorStatisticsCache(String userId, CreatorStatisticsResponseVO statistics) {
        if (StringUtils.isBlank(userId)) {
            return;
        }
        
        String cacheKey = RedisKeyEnum.CREATOR_STATISTICS_CACHE.getKey(userId);
        
        if (statistics == null) {
            redisUtil.set(cacheKey, WebConstant.CACHE_NONE, RedisKeyEnum.CREATOR_STATISTICS_CACHE.getExpireTime());
        } else {
            log.debug("刷新创作者统计信息缓存: userId={}", userId);
            redisUtil.set(cacheKey, JsonUtil.toJsonString(statistics), 
                    RedisKeyEnum.CREATOR_STATISTICS_CACHE.getExpireTime());
        }
    }
    
    /**
     * 删除创作者统计信息缓存
     *
     * @param userId 用户ID
     */
    public void deleteCreatorStatisticsCache(String userId) {
        if (StringUtils.isBlank(userId)) {
            return;
        }
        
        String cacheKey = RedisKeyEnum.CREATOR_STATISTICS_CACHE.getKey(userId);
        redisUtil.del(cacheKey);
        log.debug("删除创作者统计信息缓存: userId={}", userId);
    }
}

